home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / Inside Mac Movie Toolbox Code / mtb12.c < prev    next >
Text File  |  1992-10-22  |  1KB  |  61 lines

  1. //    Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  2.  
  3. #include "mtb.h"
  4.  
  5. typedef SndCommand *SndCmdPtr;
  6.  
  7. typedef struct {
  8.     short             format;
  9.     short             numSynths;
  10. } Snd1Header, *Snd1HdrPtr, **Snd1HdrHndl;
  11.  
  12. typedef struct {
  13.     short             format;
  14.     short             refCount;
  15. } Snd2Header, *Snd2HdrPtr, **Snd2HdrHndl;
  16.  
  17. typedef struct {
  18.     short             synthID;
  19.     long             initOption;
  20. } SynthInfo, *SynthInfoPtr;
  21.  
  22.  
  23. long GetSndHdrOffset (Handle sndHandle)
  24. {
  25.     short howManyCmds;
  26.     long sndOffset  = 0;
  27.     Ptr sndPtr;
  28.     
  29.     if (sndHandle == nil) return 0;
  30.     sndPtr = *sndHandle;
  31.     if (sndPtr == nil) return 0;
  32.     
  33.     if ((*(Snd1HdrPtr)sndPtr).format == firstSoundFormat) {
  34.         short synths = ((Snd1HdrPtr)sndPtr)->numSynths;
  35.         sndPtr += sizeof(Snd1Header) + (sizeof(SynthInfo) * synths);
  36.     } else {
  37.         sndPtr += sizeof(Snd2Header);
  38.     }
  39.     
  40.     howManyCmds = *(short *)sndPtr;
  41.     
  42.     sndPtr += sizeof(howManyCmds);
  43.     // sndPtr is now at the first sound command - cruise all
  44.     //         commands and find the first soundCmd or bufferCmd
  45.     while (howManyCmds > 0) {
  46.         switch (((SndCmdPtr)sndPtr)->cmd) {
  47.             case (soundCmd + dataOffsetFlag):
  48.             case (bufferCmd + dataOffsetFlag):
  49.                 sndOffset = ((SndCmdPtr)sndPtr)->param2;
  50.                 howManyCmds = 0;        /* done, get out of loop */                
  51.                 break;
  52.             default:                    /* catch any other type of commands */
  53.                 sndPtr += sizeof(SndCommand);
  54.                 howManyCmds--;
  55.                 break;
  56.         }
  57.     }                                    /* done with all the commands */
  58.  
  59.     return sndOffset;
  60. }
  61.